package com.hyl.service;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

import java.util.Arrays;

/**
 * @Description TODO
 * @Author hyl
 * @Date 2023/4/28 9:52
 **/
public class LoggerServer {

	//前置增强
	public void beforeaaa(JoinPoint jp){ //调用方法前执行
		System.out.println("调用before："+jp.getTarget()+" 的 "
				+jp.getSignature().getName()
				+" 的方法，参数："+ Arrays.toString(jp.getArgs()));
	}

	//抛出异常增强
	public void afterThrowing(JoinPoint jp,RuntimeException e){//方法执行过程中出错
		System.out.println("调用afterThrowing："+jp.getTarget()+" 的 "
				+jp.getSignature().getName()
				+" 的方法，异常："+ e);
	}

	//后置增强
	public void afterReturning(JoinPoint jp,Object ret){ //方法正确执行
		System.out.println("调用afterReturning："+jp.getTarget()+" 的 "
				+jp.getSignature().getName()
				+" 的方法，结果："+ ret);
	}

	//最终增强
	public void after(JoinPoint jp){
		System.out.println("调用after："+jp.getTarget()+" 的 "
				+jp.getSignature().getName()
				+" 的方法,结束");
	}

	//环绕增强
	public Object around(ProceedingJoinPoint jp) throws  Throwable{
		System.out.println("调用："+jp.getTarget()+" 的 "
				+jp.getSignature().getName()
				+" 的方法，参数："+ Arrays.toString(jp.getArgs()));
		try {
			//执行目标方法，并获得返回结果
			Object ret = jp.proceed();
			System.out.println("调用："+jp.getTarget()+" 的 "
					+jp.getSignature().getName()
					+" 的方法，结果："+ ret);
			return ret;
		}catch (Throwable e){
			System.out.println("调用："+jp.getTarget()+" 的 "
					+jp.getSignature().getName()
					+" 的方法，异常："+ e);
			throw e;
		}finally {
			System.out.println("调用："+jp.getTarget()+" 的 "
					+jp.getSignature().getName()
					+" 的方法,结束");
		}
	}

}
